About

This document contains analysis of recent data regarding wage taxes, licensing, zoning, and mobility related to Philadelphia’s nighttime economy.

Analysis by Michael Fichman of Philadelphia City Council’s Arts and Culture Task Force, Nightlife Committee.

Wage tax revenue data obtained from Philadelphia Controller’s Office, updated for the 2021 tax year, 3/8/2022. All other data obtained from Open Data Philly or Indigo Bike Share, April, 2022.

For code base used to synthesize these data, refer to the code download button at the top of this document or visit the github repository for this page - https://github.com/mafichman/ACTF_nightlife

Questions, contact

1. Hospitality Wage Tax Receipts, 2014-2022

Quarterly wage tax receipts for industries in the arts and hospitality were dramatically impacted by the pandemic which began in March, 2020, and have not fully recovered.

Data on nighttime-specific industries tend not to be subdivided by day and nighttime activity in wage tax data.

All dollar values adjusted for inflation (2021 dollars) based on BLS guidelines.

1.1. Tax revenues by year in millions of dollars

year Arts, Entertainment, and Other Recreation Hotels Restaurants
2014 8.78 9.47 36.89
2015 14.35 12.10 52.20
2016 16.06 12.18 55.62
2017 16.21 11.87 57.90
2018 16.65 12.44 59.19
2019 18.48 12.83 61.75
2020 13.26 6.53 41.47
2021 12.63 7.81 43.26

1.3 Tax Revenue in Pandemic Year 1

Year over year losses - Pandemic Year 1 - Wage tax revenues during March, 2020 - December, 2021 relative to March, 2019 - February, 2020.

As gross (in millions of US dollars, adjust for inflation to 2021 dollars) and as a percentage change.

variable Pre-pandemic year Pandemic year 1 Pct_Change
Arts_Entertainment_Recreation 16.51 10.81 -34.52
Hotels 11.55 4.75 -58.87
Restaurants 55.84 33.08 -40.76
Total 1964.94 1787.38 -9.04

1.3 Tax Loss Estimates and Recovery Timeline

Tax revenues by the end of 2021 are still falling short of expected, meaning that recovery has not been achieved. Expected revenues are based on 2014-2020(TY Q1) trends (based on year, quarter and sector) and adjusted for inflation to 2021 dollars.

Projected revenues are climbing back towards pre-pandemic status-quo.

Wage tax losses since the beginning of 2020, relative to projections based on 2014-19, are still as much as $2 million per quarter by sector.

Total tax shortfalls (compared to pre-pandemic trend) since March, 2020, in millions (2021 dollars)

sector Est Loss (millions)
Arts, Entertainment, and Other Recreation -14.91
Hotels -18.69
Restaurants -36.96

2. Save Our Stages Grants

This repo contains interactive maps and analysis of SBA Grants given as part of the “Save Our Stages” Act passed by the US Congress.

The data being used here have been geocoded using the Google Geocoding service, which is highly accurate but not error free. Data are current as of August 17, 2021, and are available from the SBA.

2.2. Grantee map

The following map shows the grantee locations.

2.2. Philadelphia SVOG grant breakdown:

Num Grants Grants Total Mean Grant Median Grant
68 88135486 1296110 247143.4

2.3. Phila SVOG searchable database:

3. Zoning and Assembly Licenses

A Special Assembly Occupancy License (SAOL) is the highest form of license for assembly for entertainment for 50+ people (non-seated). In combination with an amusement license and regular business licenses, this is what you usually need to open a venue. These licenses are difficult to get, and can be expensive. Much expense and risk is incurred when you need a zoning variance (and council approval) or to go through a zoning process triggered by a special exception.

SAOLs are only available by right in very few zoning categories, most of these the most expensive land in Center City. Recently, people have NOT been taking out licenses in CC, they have been going through zoning processes in nearby neighborhoods with transit access and clusters of amenities, and SAOLs have been going extinct much faster than they are being created.

There are a few opportunities for Council to make SAOLs easier to access - one is by supporting operators in getting variances, two is by opening up more zoning districts to SAOLs by right.

24HrPHL put together a “playbook” for how to obtain a SAOL in 2019 that was vetted by then L&I Commissioner Dave Perri.

The number of active SAOLs in Philadelphia is declining, and the places where people want to (or can afford to) build creative spaces are not the places where they are available by-right. Only 28% of active SAOLs are in by-right districts.

Frequently, people are applying for SAOLs in CMX-2.5 properties - where this use is availabe by special exception Opening CMX-2.5 to by-right SAOL would more than double the amount of commercial parcels eligible for by-right SAOL.

## Reading layer `Zoning_BaseDistricts' from data source 
##   `https://opendata.arcgis.com/datasets/0bdb0b5f13774c03abf8dc2f1aa01693_0.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 29151 features and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -75.28023 ymin: 39.87082 xmax: -74.95581 ymax: 40.13786
## Geodetic CRS:  WGS 84
## Reading layer `OGRGeoJSON' from data source 
##   `https://phl.carto.com/api/v2/sql?q=SELECT+*+FROM+business_licenses&filename=business_licenses&format=geojson&skipfields=cartodb_id' 
##   using driver `GeoJSON'
## Simple feature collection with 0 features and 0 fields
## Bounding box:  xmin: NA ymin: NA xmax: NA ymax: NA
## Geodetic CRS:  WGS 84

3.1. Summary of SAOL-eligible Districts

Assembly is allowed by right in four zoning districts, and by special exception in four others.

Here are some very basic descriptions of these types of zones, with information sourced from Anastasio Law - http://phillyzoning.com/

By Right

-CA-2 - Auto-oriented commercial

-CMX-4 - Commercial Mixed Use, mostly found in Center City or along major arterials like Broad, Market or Chestnut Streets

-CMX-5 - Commercial Mixed Use, found in the core of Center City office districts

-ICMX - Commercial/Industrial uses designed as a buffer between commercial and residential uses

Special Exception

-CMX-2 - Neighborhood commercial corridor, mixed use - e.g. Baltimore Avenue, Germantown Avenue

-CMX-2.5 - Commercial mixed use designed to promote pedestrian-friendly uses

-CMX-3 - Lower density commercial mixed use than CMX 4&5, found on major corridors like Kensington Ave, South St, Broad south of Washington.

-IRMX - “Low impact” industrial, including artist spaces

City-wide, roughly 26% of commercial districts (by area) are zoned for assembly by right. Much of this area is in large Center City tracts where creative spaces are unlikely to be developed due to cost or constraints of the land.

assembly_allowed sum_area Pct
By-Right 78538211 [US_survey_foot^2] 26.37 [1]
Not Permitted 42801765 [US_survey_foot^2] 14.37 [1]
Special Exception 176471533 [US_survey_foot^2] 59.26 [1]

3.2. City-wide zoning examination

The majority of areas zoned for assembly by-right are in Center City. This is not where most development of creative entertainment is taking place.

Take a look at districts outside Center City like Fishtown - by-right SAOL is not really allowed by-right anywhere.

When the license data from OpenDataPhilly are back online - this map will contain SAOL licence locations as well.

DATA FROM OPENDATAPHILLY UNAVAILABLE 5/8/2022

3.4. SAOL issuance timeline

Very few SAOLs are issued in Philly, and especially few the last two years. The following chart shows the date when SAOL’s were issued. 2006 probably has data inflated by the start of the record-keeping period for these data.

DATA FROM OPENDATAPHILLY UNAVAILABLE 5/8/2022

Record numbers of licenses became inactive in 2020… The following chart shows the years in which SAOL’s became inactive. Meanwhile, the real estate market is getting much more competitive and entertainment wages are slow to recover (see Section 1 of this document).

DATA FROM OPENDATAPHILLY UNAVAILABLE 5/8/2022

Among active Special Assembly Occupancy Licenses, only 35 (28%) were permitted by right in the zones where they were created.

DATA FROM OPENDATAPHILLY UNAVAILABLE 5/8/2022

Next steps -

How has by-right vs. exception/variance changed over time? How is this related to property costs / tax rates / valuation? How many SAOLs are also getting amusement licenses? How many can we verify are music venues? Are temporary assembly licenses in the data set?

DATA FROM OPENDATAPHILLY UNAVAILABLE 5/8/2022

Next up for analysis

overlays, Mobility trends, PPP data, Illuminate the Arts grants

Bike Share and Mobility

Philadelphia Bike Share Q2, 2021

ggplot(dat2 %>%
         group_by(week) %>%
         tally())+
  geom_line(aes(x = week, y = n))+
  labs(title="Bike share trips per week Philadelphia, 2021",
       x="Week (2021)", 
       y="Trips")+
  plotTheme

ggplot(dat2 %>% mutate(hour = hour(mdy_hm(start_time)),
                       month = month(mdy_hm(start_time)),
                       day_type = ifelse(dotw %in% c("Sat", "Sun", "Fri"), "Weekend", "Weekday"),
                       month = case_when(month == 1 ~ "01-2021",
                                         month == 2 ~ "02-2021",
                                         month == 3 ~ "03-2021",
                                         month == 4 ~ "04-2021",
                                         month == 5 ~ "05-2021",
                                         month == 6 ~ "06-2021",
                                         month == 7 ~ "07-2021",
                                         month == 8 ~ "08-2021",
                                         month == 9 ~ "09-2021",
                                         month == 10 ~ "10-2021",
                                         month == 11 ~ "11-2021",
                                         month == 12 ~ "12-2021")))+
  geom_rect(aes(xmin=0,
                xmax = 6,
                ymin = 0,
                ymax = Inf), fill = 'light grey', alpha = 0.05)+
  geom_rect(aes(xmin=18,
                xmax = 24,
                ymin = 0,
                ymax = Inf), fill = 'light grey', alpha = 0.05)+
  geom_freqpoly(aes(hour, color = day_type), binwidth = 1)+
  scale_x_continuous(name="Hour", breaks=seq(0,24,6))+
  labs(title="Total Bike Share Trips",
       subtitle = "Philadelphia, 2021",
       x="Hour", 
       y="Trips")+
  facet_wrap(~month)+
  theme(legend.title = element_blank())+
  plotTheme
LS0tDQp0aXRsZTogIkFDVEYgTmlnaHRsaWZlIERhdGEgQW5hbHlzaXMgYW5kIE91dHB1dHMiDQphdXRob3I6ICJNaWNoYWVsIEZpY2htYW4iDQpkYXRlOiAiTWF5IDgsIDIwMjIiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KGxlYWZsZXQuZXh0cmFzKQ0KbGlicmFyeShsZWFmbGV0LnByb3ZpZGVycykNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkodGlncmlzKQ0KbGlicmFyeShtYXB2aWV3KQ0KDQpwbG90VGhlbWUgPC0gdGhlbWUoDQogIHBsb3QudGl0bGUgPWVsZW1lbnRfdGV4dChzaXplPTEyKSwNCiAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTgpLA0KICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAjIFNldCB0aGUgZW50aXJlIGNoYXJ0IHJlZ2lvbiB0byBibGFuaw0KICBwYW5lbC5iYWNrZ3JvdW5kPWVsZW1lbnRfYmxhbmsoKSwNCiAgcGxvdC5iYWNrZ3JvdW5kPWVsZW1lbnRfYmxhbmsoKSwNCiAgI3BhbmVsLmJvcmRlcj1lbGVtZW50X3JlY3QoY29sb3VyPSIjRjBGMEYwIiksDQogICMgRm9ybWF0IHRoZSBncmlkDQogIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9saW5lKGNvbG91cj0iI0QwRDBEMCIsc2l6ZT0uNzUpLA0KICBheGlzLnRpY2tzPWVsZW1lbnRfYmxhbmsoKSkNCg0KbWFwVGhlbWUgPC0gdGhlbWUocGxvdC50aXRsZSA9ZWxlbWVudF90ZXh0KHNpemU9MTIpLA0KICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTgpLA0KICAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgICAgICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2xpbmUoY29sb3VyID0gJ3RyYW5zcGFyZW50JyksDQogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAidmVydGljYWwiLCANCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxLCAxLCAxLCAxLCAnY20nKSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgxLCAiY20iKSwgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC4yLCAiY20iKSkNCg0KDQoNCndhZ2VfdGF4X3JldmVudWUgPC0gcmVhZF9leGNlbCgifi9HaXRIdWIvQUNURl9uaWdodGxpZmUvZGF0YS93YWdlLXRheC1yZXZlbnVlLnhsc3giKSAlPiUNCiAgcmVuYW1lKEFydHNfRW50ZXJ0YWlubWVudF9SZWNyZWF0aW9uID0gJ0FydHMsIEVudGVydGFpbm1lbnQsIGFuZCBPdGhlciBSZWNyZWF0aW9uJykgJT4lDQogIG11dGF0ZSh5ZWFyID0geWVhcih5bWQoZGF0ZSkpLA0KICAgICAgICAgbW9udGggPSBtb250aCh5bWQoZGF0ZSkpKQ0KDQojIExvYWQgZGF0YSwgcmVtb3ZlIGR1cGxpY2F0ZXMsIGFkanVzdCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgZG9sbGFycw0Kd2FnZV90YXhfcmV2ZW51ZV9uZXcgPC0gcmVhZC5jc3YoImh0dHBzOi8vcGhsLWJ1ZGdldC1kYXRhc2V0dGUuaGVyb2t1YXBwLmNvbS9yZXZlbnVlL3dhZ2UtY29sbGVjdGlvbnMtYnktc2VjdG9yLmNzdj9zZWN0b3JfX2luPSU1QiUyMkhvdGVscyUyMiUyQyslMjJBcnRzJTJDK0VudGVydGFpbm1lbnQlMkMrYW5kK090aGVyK1JlY3JlYXRpb24lMjIlMkMrJTIyUmVzdGF1cmFudHMlMjIlNUQmX3NvcnRfZGVzYz1kYXRlJl9zaXplPW1heCIpICU+JQ0KICAgIG11dGF0ZSh5ZWFyID0geWVhcih5bWQoZGF0ZSkpLA0KICAgICAgICAgICBtb250aCA9IG1vbnRoKHltZChkYXRlKSkpICU+JQ0KICBzZWxlY3QoLXJvd2lkKSAlPiUNCiAgZ3JvdXBfYnkoZmlzY2FsX3llYXIsIGZpc2NhbF9xdWFydGVyLCBzZWN0b3IpICU+JQ0KICBzbGljZSgxKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUodG90YWwgPSBjYXNlX3doZW4oeWVhciA9PSAyMDE0IH4gdG90YWwgKiAxLjEyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDE1IH4gdG90YWwgKiAxLjEyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDE2IH4gdG90YWwgKiAxLjEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDE3IH4gdG90YWwgKiAxLjA4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDE4IH4gdG90YWwgKiAxLjA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDE5IH4gdG90YWwgKiAxLjA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDIwIH4gdG90YWwgKiAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9PSAyMDIxIH4gdG90YWwpKQ0KYGBgDQoNCiMgQWJvdXQNCg0KVGhpcyBkb2N1bWVudCBjb250YWlucyBhbmFseXNpcyBvZiByZWNlbnQgZGF0YSByZWdhcmRpbmcgd2FnZSB0YXhlcywgbGljZW5zaW5nLCB6b25pbmcsIGFuZCBtb2JpbGl0eSByZWxhdGVkIHRvIFBoaWxhZGVscGhpYSdzIG5pZ2h0dGltZSBlY29ub215Lg0KDQpBbmFseXNpcyBieSBNaWNoYWVsIEZpY2htYW4gb2YgUGhpbGFkZWxwaGlhIENpdHkgQ291bmNpbCdzIEFydHMgYW5kIEN1bHR1cmUgVGFzayBGb3JjZSwgTmlnaHRsaWZlIENvbW1pdHRlZS4gDQoNCldhZ2UgdGF4IHJldmVudWUgZGF0YSBvYnRhaW5lZCBmcm9tIFBoaWxhZGVscGhpYSBDb250cm9sbGVyJ3MgT2ZmaWNlLCB1cGRhdGVkIGZvciB0aGUgMjAyMSB0YXggeWVhciwgMy84LzIwMjIuIEFsbCBvdGhlciBkYXRhIG9idGFpbmVkIGZyb20gT3BlbiBEYXRhIFBoaWxseSBvciBJbmRpZ28gQmlrZSBTaGFyZSwgQXByaWwsIDIwMjIuDQoNCkZvciBjb2RlIGJhc2UgdXNlZCB0byBzeW50aGVzaXplIHRoZXNlIGRhdGEsIHJlZmVyIHRvIHRoZSBjb2RlIGRvd25sb2FkIGJ1dHRvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZG9jdW1lbnQgb3IgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IGZvciB0aGlzIHBhZ2UgLSBodHRwczovL2dpdGh1Yi5jb20vbWFmaWNobWFuL0FDVEZfbmlnaHRsaWZlDQoNClF1ZXN0aW9ucywgY29udGFjdCBtZmljaG1hbkB1cGVubi5lZHUNCg0KIyAxLiBIb3NwaXRhbGl0eSBXYWdlIFRheCBSZWNlaXB0cywgMjAxNC0yMDIyDQoNClF1YXJ0ZXJseSB3YWdlIHRheCByZWNlaXB0cyBmb3IgaW5kdXN0cmllcyBpbiB0aGUgYXJ0cyBhbmQgaG9zcGl0YWxpdHkgd2VyZSBkcmFtYXRpY2FsbHkgaW1wYWN0ZWQgYnkgdGhlIHBhbmRlbWljIHdoaWNoIGJlZ2FuIGluIE1hcmNoLCAyMDIwLCBhbmQgaGF2ZSBub3QgZnVsbHkgcmVjb3ZlcmVkLiANCg0KRGF0YSBvbiBuaWdodHRpbWUtc3BlY2lmaWMgaW5kdXN0cmllcyB0ZW5kIG5vdCB0byBiZSBzdWJkaXZpZGVkIGJ5IGRheSBhbmQgbmlnaHR0aW1lIGFjdGl2aXR5IGluIHdhZ2UgdGF4IGRhdGEuDQoNCkFsbCBkb2xsYXIgdmFsdWVzIGFkanVzdGVkIGZvciBpbmZsYXRpb24gKDIwMjEgZG9sbGFycykgYmFzZWQgb24gQkxTIGd1aWRlbGluZXMuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgc2VjdG9yKSAlPiUNCiAgc3VtbWFyaXplKHN1bSA9IHN1bSh0b3RhbCksDQogICAgICAgICAgICBzdW0gPSByb3VuZCgoc3VtLzEwMDAwMDApLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2xpbmUoYWVzKHggPSBhcy5EYXRlKGRhdGUpLCB5PXN1bSwgY29sb3IgPSBzZWN0b3IpKSsNCiAgeWxhYigiUXVhcnRlcmx5IFdhZ2UgVGF4IFJldmVudWUgKCQgTWlsbGlvbnMpIikrDQogIHhsYWIoIkRhdGUiKSsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgV2FnZSBUYXggUmVjZWlwdHMgZm9yIFRocmVlIEhvc3BpdGFsaXR5IEluZHVzdHJpZXMiLA0KICAgIHN1YnRpdGxlID0gIkFkanVzdGVkIGZvciBpbmZsYXRpb24gdG8gMjAyMSBEb2xsYXJzLiBTb3VyY2U6IFBoaWxhZGVscGhpYSBDaXR5IENvbnRyb2xsZXIncyBPZmZpY2UsIEJMUyIpKw0KICBwbG90VGhlbWUNCmBgYA0KDQojIyAxLjEuIFRheCByZXZlbnVlcyBieSB5ZWFyIGluIG1pbGxpb25zIG9mIGRvbGxhcnMNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICBncm91cF9ieSh5ZWFyLCBzZWN0b3IpICU+JQ0KICBzdW1tYXJpemUoc3VtID0gc3VtKHRvdGFsKSkgJT4lDQogIG11dGF0ZShzdW0gPSByb3VuZCgoc3VtLzEwMDAwMDApLCBkaWdpdHMgPSAyKSkgJT4lDQogIHNwcmVhZChzZWN0b3IsIHN1bSkgJT4lDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KDQpgYGANCiMjIDEuMyBUYXggUmV2ZW51ZSBpbiBQYW5kZW1pYyBZZWFyIDENCg0KWWVhciBvdmVyIHllYXIgbG9zc2VzIC0gUGFuZGVtaWMgWWVhciAxIC0gV2FnZSB0YXggcmV2ZW51ZXMgZHVyaW5nIE1hcmNoLCAyMDIwIC0gRGVjZW1iZXIsIDIwMjEgcmVsYXRpdmUgdG8gTWFyY2gsIDIwMTkgLSBGZWJydWFyeSwgMjAyMC4NCg0KQXMgZ3Jvc3MgKGluIG1pbGxpb25zIG9mIFVTIGRvbGxhcnMsIGFkanVzdCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgZG9sbGFycykgYW5kIGFzIGEgcGVyY2VudGFnZSBjaGFuZ2UuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlICU+JQ0KICBtdXRhdGUocGFuZGVtaWMgPSBjYXNlX3doZW4oeWVhciA9PSAyMDIwICYgbW9udGggPj0zIH4gIk1hcmNoMjAyMF9GZWIyMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPT0gMjAyMSB+ICJNYXJjaDIwMjBfRmViMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMjAgJiBtb250aCA8MyB+ICJNYXJjaDIwMTlfRmViMjAyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID09IDIwMTkgJiBtb250aCA+IDMgfiAiTWFyY2gyMDE5X0ZlYjIwMjAiKSkgJT4lDQogIGZpbHRlcihpcy5uYShwYW5kZW1pYykgPT0gRkFMU0UpICU+JQ0KICBzZWxlY3QoLWRhdGUsIC1tb250aCwgLXllYXIgKSAlPiUNCiAgZ2F0aGVyKC1wYW5kZW1pYywga2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiKSAlPiUNCiAgZ3JvdXBfYnkocGFuZGVtaWMsIHZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXplKHN1bSA9IHN1bSh2YWx1ZSkpICU+JQ0KICBtdXRhdGUoc3VtID0gcm91bmQoKHN1bS8xMDAwMDAwKSwgZGlnaXRzID0gMikpICU+JQ0KICBzcHJlYWQocGFuZGVtaWMsIHN1bSkgJT4lDQogIG11dGF0ZShQY3RfQ2hhbmdlID0gcm91bmQoMTAwKigoTWFyY2gyMDIwX0ZlYjIwMjEgLSBNYXJjaDIwMTlfRmViMjAyMCkvIE1hcmNoMjAxOV9GZWIyMDIwKSwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoIlByZS1wYW5kZW1pYyB5ZWFyIiA9IE1hcmNoMjAxOV9GZWIyMDIwLA0KICAgICAgICAgIlBhbmRlbWljIHllYXIgMSIgPSBNYXJjaDIwMjBfRmViMjAyMSkgJT4lDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KDQpgYGANCg0KIyMgMS4zIFRheCBMb3NzIEVzdGltYXRlcyBhbmQgUmVjb3ZlcnkgVGltZWxpbmUNCg0KVGF4IHJldmVudWVzIGJ5IHRoZSBlbmQgb2YgMjAyMSBhcmUgc3RpbGwgZmFsbGluZyBzaG9ydCBvZiBleHBlY3RlZCwgbWVhbmluZyB0aGF0IHJlY292ZXJ5IGhhcyBub3QgYmVlbiBhY2hpZXZlZC4gRXhwZWN0ZWQgcmV2ZW51ZXMgYXJlIGJhc2VkIG9uIDIwMTQtMjAyMChUWSBRMSkgdHJlbmRzIChiYXNlZCBvbiB5ZWFyLCBxdWFydGVyIGFuZCBzZWN0b3IpIGFuZCBhZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgZG9sbGFycy4NCg0KYGBge3IgbW9kZWwsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbW9kZWwgPC0gbG0oZGF0YSA9IHdhZ2VfdGF4X3JldmVudWVfbmV3ICU+JSBmaWx0ZXIoeWVhciA8IDIwMjApICU+JSBzZWxlY3Qoc2VjdG9yLCBmaXNjYWxfcXVhcnRlciwgeWVhciwgdG90YWwpLCB0b3RhbCB+IGZpc2NhbF9xdWFydGVyICsgeWVhciArIHNlY3RvcikNCg0Kc3VtbWFyeShtb2RlbCkNCg0KDQpwcmVkaWN0KG1vZGVsLCB3YWdlX3RheF9yZXZlbnVlX25ldykgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgJT4lIA0KICByZW5hbWUocHJlZCA9ICIuIikgJT4lIA0KICBjYmluZCguLCB3YWdlX3RheF9yZXZlbnVlX25ldykgLT4gd2FnZV90YXhfcmV2ZW51ZV9uZXcNCmBgYA0KDQpQcm9qZWN0ZWQgcmV2ZW51ZXMgYXJlIGNsaW1iaW5nIGJhY2sgdG93YXJkcyBwcmUtcGFuZGVtaWMgc3RhdHVzLXF1by4NCg0KYGBge3IgcHJvamVjdGlvbl9jaGFydCwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVjaG89RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgc2VjdG9yLCB5ZWFyLCBtb250aCkgJT4lIA0KICBzdW1tYXJpemUoQWN0dWFsID0gc3VtKHRvdGFsKSwgDQogICAgICAgICAgICBQcmUuUGFuZGVtaWMuVHJlbmQgPSBzdW0ocHJlZCkpICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMjAxOCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGRhdGUsIHNlY3RvciwgQWN0dWFsLCBQcmUuUGFuZGVtaWMuVHJlbmQpICU+JQ0KICBnYXRoZXIoLXNlY3RvciwgLSBkYXRlLCBrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIpICU+JQ0KICBtdXRhdGUodmFsdWVfbSA9IHJvdW5kKHZhbHVlLzEwMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAgZ2dwbG90KCkrDQogICAgZ2VvbV9saW5lKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT12YWx1ZV9tLCBjb2xvciA9IHZhcmlhYmxlKSkrIA0KICAgIGdlb21fbGluZShhZXMoeCA9IGFzLkRhdGUoZGF0ZSksIHk9dmFsdWVfbSwgY29sb3IgPSB2YXJpYWJsZSksIA0KICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGEgPSAwLjUpKw0KICBmYWNldF93cmFwKH5zZWN0b3IpKw0KICAgIHlsYWIoIlF1YXJ0ZXJseSBXYWdlIFRheCBSZXZlbnVlICgkIE1pbGxpb25zKSIpKw0KICAgIHhsYWIoIkRhdGUiKSsNCiAgICBsYWJzKA0KICAgICAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgV2FnZSBUYXggU2hvcnRmYWxscyIsDQogICAgICAgIHN1YnRpdGxlID0gIkFkanVzdGVkIGZvciBpbmZsYXRpb24gdG8gMjAyMSBEb2xsYXJzLlxuIFRyZW5kIGJhc2VkIG9uIDIwMTQtMjAxOSByZWdyZXNzaW9uIGNvbnRyb2xsaW5nIGZvciB5ZWFyLCBxdWFydGVyLCBzZWN0b3IuIFxuU291cmNlOiBQaGlsYWRlbHBoaWEgQ2l0eSBDb250cm9sbGVyJ3MgT2ZmaWNlLCBCTFMiKSsNCiAgICBwbG90VGhlbWUNCg0KYGBgDQoNCldhZ2UgdGF4IGxvc3NlcyBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIDIwMjAsIHJlbGF0aXZlIHRvIHByb2plY3Rpb25zIGJhc2VkIG9uIDIwMTQtMTksIGFyZSBzdGlsbCBhcyBtdWNoIGFzICQyIG1pbGxpb24gcGVyIHF1YXJ0ZXIgYnkgc2VjdG9yLg0KDQpgYGB7ciBwcm9qZWN0aW9uX2NoYXJ0X2Jhciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVjaG89RkFMU0V9DQp3YWdlX3RheF9yZXZlbnVlX25ldyAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgc2VjdG9yLCB5ZWFyLCBtb250aCkgJT4lIA0KICBzdW1tYXJpemUoQWN0dWFsID0gc3VtKHRvdGFsKSwgDQogICAgICAgICAgICBQcmUuUGFuZGVtaWMuVHJlbmQgPSBzdW0ocHJlZCkpICU+JSANCiAgbXV0YXRlKGxvc3MgPSBBY3R1YWwgLSBQcmUuUGFuZGVtaWMuVHJlbmQpICU+JQ0KICBmaWx0ZXIoeWVhciA+PSAyMDIwKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoZGF0ZSwgc2VjdG9yLCBsb3NzKSAlPiUNCiAgZ2F0aGVyKC1zZWN0b3IsIC0gZGF0ZSwga2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiKSAlPiUNCiAgbXV0YXRlKHZhbHVlX20gPSByb3VuZCh2YWx1ZS8xMDAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGdncGxvdCgpKw0KICAgIGdlb21fYmFyKGFlcyh4ID0gYXMuRGF0ZShkYXRlKSwgeT12YWx1ZV9tKSwgc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImdyZXkiKSsgDQogIGZhY2V0X3dyYXAofnNlY3RvcikrDQogICAgeWxhYigiUXVhcnRlcmx5IFdhZ2UgVGF4IFJldmVudWUgc2hvcnRmYWxsICgkIE1pbGxpb25zKSIpKw0KICAgIHhsYWIoIkRhdGUiKSsNCiAgICBsYWJzKA0KICAgICAgICB0aXRsZSA9ICJQaGlsYWRlbHBoaWEgV2FnZSBUYXggUmVjZWlwdHMgdnMuIFByZS1QYW5kZW1pYyBUcmVuZHMiLA0KICAgICAgICBzdWJ0aXRsZSA9ICJBZGp1c3RlZCBmb3IgaW5mbGF0aW9uIHRvIDIwMjEgRG9sbGFycy4gU291cmNlOiBQaGlsYWRlbHBoaWEgQ2l0eSBDb250cm9sbGVyJ3MgT2ZmaWNlLCBCTFMiKSsNCiAgICBwbG90VGhlbWUNCg0KYGBgDQoNClRvdGFsIHRheCBzaG9ydGZhbGxzIChjb21wYXJlZCB0byBwcmUtcGFuZGVtaWMgdHJlbmQpIHNpbmNlIE1hcmNoLCAyMDIwLCBpbiBtaWxsaW9ucyAoMjAyMSBkb2xsYXJzKQ0KDQpgYGB7ciBsb3NzX3N1bW1hcnksIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCndhZ2VfdGF4X3JldmVudWVfbmV3ICU+JQ0KICBncm91cF9ieShkYXRlLCBzZWN0b3IsIHllYXIsIG1vbnRoKSAlPiUgDQogIHN1bW1hcml6ZShBY3R1YWwgPSBzdW0odG90YWwpLCANCiAgICAgICAgICAgIFByZS5QYW5kZW1pYy5UcmVuZCA9IHN1bShwcmVkKSkgJT4lIA0KICBtdXRhdGUobG9zcyA9IEFjdHVhbCAtIFByZS5QYW5kZW1pYy5UcmVuZCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAyMCAmIG1vbnRoID49MyB8IHllYXIgPiAyMDIwKSAlPiUNCiAgZ3JvdXBfYnkoc2VjdG9yKSAlPiUNCiAgc3VtbWFyaXplKCJFc3QgTG9zcyAobWlsbGlvbnMpIiA9IHJvdW5kKHN1bShsb3NzKS8xMDAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGthYmxlKCkNCg0KYGBgDQoNCiMgMi4gU2F2ZSBPdXIgU3RhZ2VzIEdyYW50cw0KDQpUaGlzIHJlcG8gY29udGFpbnMgaW50ZXJhY3RpdmUgbWFwcyBhbmQgYW5hbHlzaXMgb2YgU0JBIEdyYW50cyBnaXZlbiBhcyBwYXJ0IG9mIHRoZSAiU2F2ZSBPdXIgU3RhZ2VzIiBBY3QgcGFzc2VkIGJ5IHRoZSBVUyBDb25ncmVzcy4NCg0KVGhlIGRhdGEgYmVpbmcgdXNlZCBoZXJlIGhhdmUgYmVlbiBnZW9jb2RlZCB1c2luZyB0aGUgR29vZ2xlIEdlb2NvZGluZyBzZXJ2aWNlLCB3aGljaCBpcyBoaWdobHkgYWNjdXJhdGUgYnV0IG5vdCBlcnJvciBmcmVlLiBEYXRhIGFyZSBjdXJyZW50IGFzIG9mIEF1Z3VzdCAxNywgMjAyMSwgYW5kIGFyZSBhdmFpbGFibGUgW2Zyb20gdGhlIFNCQV0oaHR0cHM6Ly9kYXRhLnNiYS5nb3YvZGF0YXNldC9zdm9nL3Jlc291cmNlLzMzMjcwYzJhLWYxYzUtNGRjYi1iYzk4LWFlZGNhZWMxOWVmMykuDQoNCiMjIDIuMi4gR3JhbnRlZSBtYXANCg0KVGhlIGZvbGxvd2luZyBtYXAgc2hvd3MgdGhlIGdyYW50ZWUgbG9jYXRpb25zLg0KDQpgYGB7ciB2ZW51ZXMsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQpnZW9jb2RlZF92ZW51ZXMgPC0gcmVhZC5jc3YoIn4vR2l0SHViL1NhdmVPdXJTdGFnZXNHcmFudHMvZGF0YS9nZW9jb2RlZF92ZW51ZXMuY3N2IikgJT4lDQogIHJlbmFtZShhY2N0X3R5cGUgPSAnQWNjb3VudC5WZW51ZScpICU+JQ0KICBmaWx0ZXIoQ2l0eSA9PSAiUGhpbGFkZWxwaGlhIiAmIFN0YXRlID09ICJQQSIpDQoNCmwgPC0gbGVhZmxldCgpICU+JSANCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZFRvcG9NYXApICU+JQ0KICBzZXRWaWV3KGxuZyA9IG1lYW4oZ2VvY29kZWRfdmVudWVzJGxvbiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICBsYXQgPSBtZWFuKGdlb2NvZGVkX3ZlbnVlcyRsYXQsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgem9vbSA9IDEwKSAlPiUNCiAgYWRkU2NhbGVCYXIocG9zaXRpb24gPSAidG9wbGVmdCIpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGE9IGdlb2NvZGVkX3ZlbnVlcyAlPiUNCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhY2N0X3R5cGUgPT0gIkxpdmUgcGVyZm9ybWluZyBhcnRzIG9yZ2FuaXphdGlvbiBvcGVyYXRvciIpLA0KICAgICAgICAgICAgICAgICAgIGxuZz1+bG9uLCANCiAgICAgICAgICAgICAgICAgICBsYXQ9fmxhdCwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPX4gMSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPX4gMC41LA0KICAgICAgICAgICAgICAgICAgIGNvbG9yPSAiYmx1ZSIsICMgIn5wYWwoYWNjdF90eXBlKSINCiAgICAgICAgICAgICAgICAgICBsYWJlbD1+cGFzdGUoc3ZvZ19ncmFudGVlLCAiIHwgR3JhbnQgJCIsIHN2b2dfYW1vdW50KSwNCiAgICAgICAgICAgICAgICAgICBncm91cD0gIkxpdmUgcGVyZm9ybWluZyBhcnRzIG9yZ2FuaXphdGlvbiBvcGVyYXRvciIpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGE9IGdlb2NvZGVkX3ZlbnVlcyAlPiUNCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhY2N0X3R5cGUgPT0gIkxpdmUgdmVudWUgb3BlcmF0b3Igb3IgcHJvbW90ZXIiKSwNCiAgICAgICAgICAgICAgICAgICBsbmc9fmxvbiwgDQogICAgICAgICAgICAgICAgICAgbGF0PX5sYXQsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID1+IDEsIA0KICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID1+IDAuNSwNCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gImJsdWUiLCAjICJ+cGFsKGFjY3RfdHlwZSkiDQogICAgICAgICAgICAgICAgICAgbGFiZWw9fnBhc3RlKHN2b2dfZ3JhbnRlZSwgIiB8IEdyYW50ICQiLCBzdm9nX2Ftb3VudCksDQogICAgICAgICAgICAgICAgICAgZ3JvdXA9ICJMaXZlIHZlbnVlIG9wZXJhdG9yIG9yIHByb21vdGVyIikgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YT0gZ2VvY29kZWRfdmVudWVzICU+JQ0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFjY3RfdHlwZSA9PSAiTW90aW9uIHBpY3R1cmUgdGhlYXRlciBvcGVyYXRvciIpLA0KICAgICAgICAgICAgICAgICAgIGxuZz1+bG9uLCANCiAgICAgICAgICAgICAgICAgICBsYXQ9fmxhdCwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPX4gMSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPX4gMC41LA0KICAgICAgICAgICAgICAgICAgIGNvbG9yPSAiYmx1ZSIsICMgIn5wYWwoYWNjdF90eXBlKSINCiAgICAgICAgICAgICAgICAgICBsYWJlbD1+cGFzdGUoc3ZvZ19ncmFudGVlLCAiIHwgR3JhbnQgJCIsIHN2b2dfYW1vdW50KSwNCiAgICAgICAgICAgICAgICAgICBncm91cD0gIk1vdGlvbiBwaWN0dXJlIHRoZWF0ZXIgb3BlcmF0b3IiKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhPSBnZW9jb2RlZF92ZW51ZXMgJT4lDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWNjdF90eXBlID09ICJNdXNldW0gT3BlcmF0b3IiKSwNCiAgICAgICAgICAgICAgICAgICBsbmc9fmxvbiwgDQogICAgICAgICAgICAgICAgICAgbGF0PX5sYXQsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID1+IDEsIA0KICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID1+IDAuNSwNCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gImJsdWUiLCAjICJ+cGFsKGFjY3RfdHlwZSkiDQogICAgICAgICAgICAgICAgICAgbGFiZWw9fnBhc3RlKHN2b2dfZ3JhbnRlZSwgIiB8IEdyYW50ICQiLCBzdm9nX2Ftb3VudCksDQogICAgICAgICAgICAgICAgICAgZ3JvdXA9ICJNdXNldW0gT3BlcmF0b3IiKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhPSBnZW9jb2RlZF92ZW51ZXMgJT4lDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWNjdF90eXBlID09ICJUYWxlbnQgcmVwcmVzZW50YXRpdmUiKSwNCiAgICAgICAgICAgICAgICAgICBsbmc9fmxvbiwgDQogICAgICAgICAgICAgICAgICAgbGF0PX5sYXQsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID1+IDEsIA0KICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID1+IDAuNSwNCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gImJsdWUiLCAjICJ+cGFsKGFjY3RfdHlwZSkiDQogICAgICAgICAgICAgICAgICAgbGFiZWw9fnBhc3RlKHN2b2dfZ3JhbnRlZSwgIiB8IEdyYW50ICQiLCBzdm9nX2Ftb3VudCksDQogICAgICAgICAgICAgICAgICAgZ3JvdXA9ICJUYWxlbnQgcmVwcmVzZW50YXRpdmUiKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhPSBnZW9jb2RlZF92ZW51ZXMgJT4lDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYWNjdF90eXBlID09ICJUaGVhdHJpY2FsIHByb2R1Y2VyIiksDQogICAgICAgICAgICAgICAgICAgbG5nPX5sb24sIA0KICAgICAgICAgICAgICAgICAgIGxhdD1+bGF0LA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9fiAxLCANCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9fiAwLjUsDQogICAgICAgICAgICAgICAgICAgY29sb3I9ICJibHVlIiwgIyAifnBhbChhY2N0X3R5cGUpIg0KICAgICAgICAgICAgICAgICAgIGxhYmVsPX5wYXN0ZShzdm9nX2dyYW50ZWUsICIgfCBHcmFudCAkIiwgc3ZvZ19hbW91bnQpLA0KICAgICAgICAgICAgICAgICAgIGdyb3VwPSAiVGhlYXRyaWNhbCBwcm9kdWNlciIpICU+JQ0KICBhZGRMYXllcnNDb250cm9sKA0KICAgIG92ZXJsYXlHcm91cHMgPSBjKCJMaXZlIHBlcmZvcm1pbmcgYXJ0cyBvcmdhbml6YXRpb24gb3BlcmF0b3IiLCANCiAgICAgICAgICAgICAgICAgICAgICAiTGl2ZSB2ZW51ZSBvcGVyYXRvciBvciBwcm9tb3RlciIsDQogICAgICAgICAgICAgICAgICAgICAgIk1vdGlvbiBwaWN0dXJlIHRoZWF0ZXIgb3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgICAgICAgICJNdXNldW0gT3BlcmF0b3IiLA0KICAgICAgICAgICAgICAgICAgICAgICJUYWxlbnQgcmVwcmVzZW50YXRpdmUiLA0KICAgICAgICAgICAgICAgICAgICAgICJUaGVhdHJpY2FsIHByb2R1Y2VyIikgLA0KICAgIG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhjb2xsYXBzZWQgPSBUUlVFKQ0KICAgICkgJT4lDQogIGhpZGVHcm91cChjKCJMaXZlIHBlcmZvcm1pbmcgYXJ0cyBvcmdhbml6YXRpb24gb3BlcmF0b3IiLCANCiAgICAgICAgICAgICAgICAgICAgICAiTW90aW9uIHBpY3R1cmUgdGhlYXRlciBvcGVyYXRvciIsDQogICAgICAgICAgICAgICAgICAgICAgIk11c2V1bSBPcGVyYXRvciIsDQogICAgICAgICAgICAgICAgICAgICAgIlRhbGVudCByZXByZXNlbnRhdGl2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgIlRoZWF0cmljYWwgcHJvZHVjZXIiKSkNCg0KbA0KDQpgYGANCiMgMi4yLiBQaGlsYWRlbHBoaWEgU1ZPRyBncmFudCBicmVha2Rvd246DQoNCmBgYHtyIHN2b2dfYnJlYWtkb3duLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KZ2VvY29kZWRfdmVudWVzICU+JQ0KICBzdW1tYXJpemUoIk51bSBHcmFudHMiID0gbigpLA0KICAgICAgICAgICAgIkdyYW50cyBUb3RhbCIgPSBzdW0oc3ZvZ19hbW91bnQpLA0KICAgICAgICAgICAgIk1lYW4gR3JhbnQiID0gbWVhbihzdm9nX2Ftb3VudCksDQogICAgICAgICAgICAiTWVkaWFuIEdyYW50IiA9IG1lZGlhbihzdm9nX2Ftb3VudCkpICU+JQ0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKCkNCmBgYA0KDQojIyAyLjMuIFBoaWxhIFNWT0cgc2VhcmNoYWJsZSBkYXRhYmFzZToNCg0KYGBge3Igc2VhcmNoYWJsZV90YWJsZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGF0YWJsZShnZW9jb2RlZF92ZW51ZXMgJT4lDQogICAgICAgICAgICBzZWxlY3QoLVgsIC1sb24sIC1sYXQsIC1hZGRyZXNzX2Z1bGwpICU+JQ0KICAgICAgICAgICAgcmVuYW1lKCdHcmFudCAoJCknID0gc3ZvZ19hbW91bnQsDQogICAgICAgICAgICAgICAgICAgR3JhbnRlZSA9IHN2b2dfZ3JhbnRlZSwNCiAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9IGFjY3RfdHlwZSksIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCkpDQpgYGANCg0KDQojIDMuIFpvbmluZyBhbmQgQXNzZW1ibHkgTGljZW5zZXMNCg0KQSBTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIChTQU9MKSBpcyB0aGUgaGlnaGVzdCBmb3JtIG9mIGxpY2Vuc2UgZm9yIGFzc2VtYmx5IGZvciBlbnRlcnRhaW5tZW50IGZvciA1MCsgcGVvcGxlIChub24tc2VhdGVkKS4gSW4gY29tYmluYXRpb24gd2l0aCBhbiBhbXVzZW1lbnQgbGljZW5zZSBhbmQgcmVndWxhciBidXNpbmVzcyBsaWNlbnNlcywgdGhpcyBpcyB3aGF0IHlvdSB1c3VhbGx5IG5lZWQgdG8gb3BlbiBhIHZlbnVlLiBUaGVzZSBsaWNlbnNlcyBhcmUgZGlmZmljdWx0IHRvIGdldCwgYW5kIGNhbiBiZSBleHBlbnNpdmUuIE11Y2ggZXhwZW5zZSBhbmQgcmlzayBpcyBpbmN1cnJlZCB3aGVuIHlvdSBuZWVkIGEgem9uaW5nIHZhcmlhbmNlIChhbmQgY291bmNpbCBhcHByb3ZhbCkgb3IgdG8gZ28gdGhyb3VnaCBhIHpvbmluZyBwcm9jZXNzIHRyaWdnZXJlZCBieSBhIHNwZWNpYWwgZXhjZXB0aW9uLg0KDQpTQU9McyBhcmUgb25seSBhdmFpbGFibGUgYnkgcmlnaHQgaW4gdmVyeSBmZXcgem9uaW5nIGNhdGVnb3JpZXMsIG1vc3Qgb2YgdGhlc2UgdGhlIG1vc3QgZXhwZW5zaXZlIGxhbmQgaW4gQ2VudGVyIENpdHkuIFJlY2VudGx5LCBwZW9wbGUgaGF2ZSBOT1QgYmVlbiB0YWtpbmcgb3V0IGxpY2Vuc2VzIGluIENDLCB0aGV5IGhhdmUgYmVlbiBnb2luZyB0aHJvdWdoIHpvbmluZyBwcm9jZXNzZXMgaW4gbmVhcmJ5IG5laWdoYm9yaG9vZHMgd2l0aCB0cmFuc2l0IGFjY2VzcyBhbmQgY2x1c3RlcnMgb2YgYW1lbml0aWVzLCBhbmQgU0FPTHMgaGF2ZSBiZWVuIGdvaW5nIGV4dGluY3QgbXVjaCBmYXN0ZXIgdGhhbiB0aGV5IGFyZSBiZWluZyBjcmVhdGVkLg0KDQpUaGVyZSBhcmUgYSBmZXcgb3Bwb3J0dW5pdGllcyBmb3IgQ291bmNpbCB0byBtYWtlIFNBT0xzIGVhc2llciB0byBhY2Nlc3MgLSBvbmUgaXMgYnkgc3VwcG9ydGluZyBvcGVyYXRvcnMgaW4gZ2V0dGluZyB2YXJpYW5jZXMsIHR3byBpcyBieSBvcGVuaW5nIHVwIG1vcmUgem9uaW5nIGRpc3RyaWN0cyB0byBTQU9McyBieSByaWdodC4NCg0KWzI0SHJQSEwgcHV0IHRvZ2V0aGVyIGEgInBsYXlib29rIiBmb3IgaG93IHRvIG9idGFpbiBhIFNBT0wgaW4gMjAxOSB0aGF0IHdhcyB2ZXR0ZWQgYnkgdGhlbiBMJkkgQ29tbWlzc2lvbmVyIERhdmUgUGVycmkuXShodHRwOi8vMjRocnBobC5vcmcvdGhlLXZlbnVlLXN0YXJ0ZXItcGxheWJvb2svKQ0KDQpUaGUgbnVtYmVyIG9mIGFjdGl2ZSBTQU9McyBpbiBQaGlsYWRlbHBoaWEgaXMgZGVjbGluaW5nLCBhbmQgdGhlIHBsYWNlcyB3aGVyZSBwZW9wbGUgd2FudCB0byAob3IgY2FuIGFmZm9yZCB0bykgYnVpbGQgY3JlYXRpdmUgc3BhY2VzIGFyZSBub3QgdGhlIHBsYWNlcyB3aGVyZSB0aGV5IGFyZSBhdmFpbGFibGUgYnktcmlnaHQuIE9ubHkgMjglIG9mIGFjdGl2ZSBTQU9McyBhcmUgaW4gYnktcmlnaHQgZGlzdHJpY3RzLiANCg0KRnJlcXVlbnRseSwgcGVvcGxlIGFyZSBhcHBseWluZyBmb3IgU0FPTHMgaW4gQ01YLTIuNSBwcm9wZXJ0aWVzIC0gd2hlcmUgdGhpcyB1c2UgaXMgYXZhaWxhYmUgYnkgc3BlY2lhbCBleGNlcHRpb24gKk9wZW5pbmcgQ01YLTIuNSB0byBieS1yaWdodCBTQU9MIHdvdWxkIG1vcmUgdGhhbiBkb3VibGUgdGhlIGFtb3VudCBvZiBjb21tZXJjaWFsIHBhcmNlbHMgZWxpZ2libGUgZm9yIGJ5LXJpZ2h0IFNBT0wuKg0KDQpgYGB7ciBkbF96b25pbmcsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQoNCnpvbmVzIDwtIHN0X3JlYWQoImh0dHBzOi8vb3BlbmRhdGEuYXJjZ2lzLmNvbS9kYXRhc2V0cy8wYmRiMGI1ZjEzNzc0YzAzYWJmOGRjMmYxYWEwMTY5M18wLmdlb2pzb24iKSAlPiUNCiAgc3RfYXNfc2YoY3JzID0gNDMyNikgJT4lDQogIG11dGF0ZShhc3NlbWJseV9hbGxvd2VkID0gaWZlbHNlKExPTkdfQ09ERSAlaW4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkNNWC00IiwgIkNNWC01IiwgIkNBLTIiLCAiSUNNWCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnktUmlnaHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKExPTkdfQ09ERSAlaW4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJDTVgtMiIsICJDTVgtMi41IiwgIkNNWC0zIiwgIklSTVgiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWFsIEV4Y2VwdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBQZXJtaXR0ZWQiICkpKQ0KDQpsaWNlbnNlcyA8LSBzdF9yZWFkKCJodHRwczovL3BobC5jYXJ0by5jb20vYXBpL3YyL3NxbD9xPVNFTEVDVCsqK0ZST00rYnVzaW5lc3NfbGljZW5zZXMmZmlsZW5hbWU9YnVzaW5lc3NfbGljZW5zZXMmZm9ybWF0PWdlb2pzb24mc2tpcGZpZWxkcz1jYXJ0b2RiX2lkIikgJT4lDQogIHN0X2FzX3NmKGNycyA9IDQzMjYpDQoNCmBgYA0KIyMgMy4xLiBTdW1tYXJ5IG9mIFNBT0wtZWxpZ2libGUgRGlzdHJpY3RzDQoNCkFzc2VtYmx5IGlzIGFsbG93ZWQgYnkgcmlnaHQgaW4gZm91ciB6b25pbmcgZGlzdHJpY3RzLCBhbmQgYnkgc3BlY2lhbCBleGNlcHRpb24gaW4gZm91ciBvdGhlcnMuDQoNCkhlcmUgYXJlIHNvbWUgdmVyeSBiYXNpYyBkZXNjcmlwdGlvbnMgb2YgdGhlc2UgdHlwZXMgb2Ygem9uZXMsIHdpdGggaW5mb3JtYXRpb24gc291cmNlZCBmcm9tIEFuYXN0YXNpbyBMYXcgLSBodHRwOi8vcGhpbGx5em9uaW5nLmNvbS8NCg0KKkJ5IFJpZ2h0Kg0KDQotQ0EtMiAtIEF1dG8tb3JpZW50ZWQgY29tbWVyY2lhbA0KDQotQ01YLTQgLSBDb21tZXJjaWFsIE1peGVkIFVzZSwgbW9zdGx5IGZvdW5kIGluIENlbnRlciBDaXR5IG9yIGFsb25nIG1ham9yIGFydGVyaWFscyBsaWtlIEJyb2FkLCBNYXJrZXQgb3IgQ2hlc3RudXQgU3RyZWV0cw0KDQotQ01YLTUgLSBDb21tZXJjaWFsIE1peGVkIFVzZSwgZm91bmQgaW4gdGhlIGNvcmUgb2YgQ2VudGVyIENpdHkgb2ZmaWNlIGRpc3RyaWN0cw0KDQotSUNNWCAtIENvbW1lcmNpYWwvSW5kdXN0cmlhbCB1c2VzIGRlc2lnbmVkIGFzIGEgYnVmZmVyIGJldHdlZW4gY29tbWVyY2lhbCBhbmQgcmVzaWRlbnRpYWwgdXNlcw0KDQoqU3BlY2lhbCBFeGNlcHRpb24qDQoNCi1DTVgtMiAtIE5laWdoYm9yaG9vZCBjb21tZXJjaWFsIGNvcnJpZG9yLCBtaXhlZCB1c2UgLSBlLmcuIEJhbHRpbW9yZSBBdmVudWUsIEdlcm1hbnRvd24gQXZlbnVlDQoNCi1DTVgtMi41IC0gQ29tbWVyY2lhbCBtaXhlZCB1c2UgZGVzaWduZWQgdG8gcHJvbW90ZSBwZWRlc3RyaWFuLWZyaWVuZGx5IHVzZXMNCg0KLUNNWC0zIC0gTG93ZXIgZGVuc2l0eSBjb21tZXJjaWFsIG1peGVkIHVzZSB0aGFuIENNWCA0JjUsIGZvdW5kIG9uIG1ham9yIGNvcnJpZG9ycyBsaWtlIEtlbnNpbmd0b24gQXZlLCBTb3V0aCBTdCwgQnJvYWQgc291dGggb2YgV2FzaGluZ3Rvbi4NCg0KLUlSTVggLSAiTG93IGltcGFjdCIgaW5kdXN0cmlhbCwgaW5jbHVkaW5nIGFydGlzdCBzcGFjZXMNCg0KYGBge3IgZXhwbG9yZV96b25lcywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG89RkFMU0UsIGV2YWwgPSBGQUxTRX0NCnpvbmVzICU+JQ0KICBhcy5kYXRhLmZyYW1lKCklPiUNCiAgZmlsdGVyKExPTkdfQ09ERSAlaW4lIGMoIkNNWC00IiwgIkNNWC01IiwgIkNBLTIiLCAiSUNNWCIsICJDTVgtMiIsICJDTVgtMi41IiwgIkNNWC0zIiwgIklSTVgiKSkgJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQsIExPTkdfQ09ERSkgJT4lDQogIHRhbGx5KCkgJT4lDQogIHJlbmFtZSgiUGFyY2VscyBjaXR5LXdpZGUiID0gbiwNCiAgICAgICAgIERpc3RyaWN0ID0gTE9OR19DT0RFKSAlPiUNCiAga2FibGUgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KYGBgDQoNCkNpdHktd2lkZSwgcm91Z2hseSAyNiUgb2YgKmNvbW1lcmNpYWwqIGRpc3RyaWN0cyAoYnkgYXJlYSkgYXJlIHpvbmVkIGZvciBhc3NlbWJseSBieSByaWdodC4gTXVjaCBvZiB0aGlzIGFyZWEgaXMgaW4gbGFyZ2UgQ2VudGVyIENpdHkgdHJhY3RzIHdoZXJlIGNyZWF0aXZlIHNwYWNlcyBhcmUgdW5saWtlbHkgdG8gYmUgZGV2ZWxvcGVkIGR1ZSB0byBjb3N0IG9yIGNvbnN0cmFpbnRzIG9mIHRoZSBsYW5kLg0KDQpgYGB7ciBwY3RfY29tbWVyY2lhbF9wcm9wcywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG89RkFMU0V9DQp6b25lcyAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoWk9OSU5HR1JPVVAsICJDb21tZXJjaWFsIikgPT0gVFJVRSkgJT4lDQogIHN0X3RyYW5zZm9ybSgyMjcyKSAlPiUNCiAgbXV0YXRlKGFyZWEgPSBzdF9hcmVhKC4pKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpJT4lDQogIGdyb3VwX2J5KGFzc2VtYmx5X2FsbG93ZWQpICU+JQ0KICBzdW1tYXJpemUoc3VtX2FyZWEgPSBzdW0oYXJlYSkpICU+JQ0KICAjcmVuYW1lKG5fcGFyY2VscyA9IG4pICU+JQ0KICBtdXRhdGUoUGN0ID0gcm91bmQoMTAwKihzdW1fYXJlYSAvIHN1bShzdW1fYXJlYSkpLCAyKSkgJT4lDQogICNyZW5hbWUoIlBhcmNlbHMgQ2l0eS1XaWRlIiA9IG5fcGFyY2VscykgJT4lDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoKQ0KYGBgDQoNCiMjIDMuMi4gQ2l0eS13aWRlIHpvbmluZyBleGFtaW5hdGlvbg0KDQpUaGUgbWFqb3JpdHkgb2YgYXJlYXMgem9uZWQgZm9yIGFzc2VtYmx5IGJ5LXJpZ2h0IGFyZSBpbiBDZW50ZXIgQ2l0eS4gVGhpcyBpcyAqbm90KiB3aGVyZSBtb3N0IGRldmVsb3BtZW50IG9mIGNyZWF0aXZlIGVudGVydGFpbm1lbnQgaXMgdGFraW5nIHBsYWNlLg0KDQpUYWtlIGEgbG9vayBhdCBkaXN0cmljdHMgb3V0c2lkZSBDZW50ZXIgQ2l0eSBsaWtlIEZpc2h0b3duIC0gYnktcmlnaHQgU0FPTCBpcyBub3QgcmVhbGx5IGFsbG93ZWQgYnktcmlnaHQgYW55d2hlcmUuDQoNCldoZW4gdGhlIGxpY2Vuc2UgZGF0YSBmcm9tIE9wZW5EYXRhUGhpbGx5IGFyZSBiYWNrIG9ubGluZSAtIHRoaXMgbWFwIHdpbGwgY29udGFpbiBTQU9MIGxpY2VuY2UgbG9jYXRpb25zIGFzIHdlbGwuDQoNCkRBVEEgRlJPTSBPUEVOREFUQVBISUxMWSBVTkFWQUlMQUJMRSA1LzgvMjAyMg0KDQpgYGB7ciBtYXBfZXhjZXB0aW9ucywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PSA4fQ0KbWFwdmlldyh6b25lcyAlPiUNCiAgICAgICAgICBmaWx0ZXIoYXNzZW1ibHlfYWxsb3dlZCAlaW4lIGMoIlNwZWNpYWwgRXhjZXB0aW9uIiwgIkJ5LVJpZ2h0IikpICU+JQ0KICAgICAgICAgIG11dGF0ZShMT05HX0NPREUgPSBjYXNlX3doZW4oTE9OR19DT0RFID09ICJDQS0yIiB+ICJCeS1SaWdodCBDQS0yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiQ01YLTQiIH4gIkJ5LVJpZ2h0IENNWC00IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiQ01YLTUiIH4gIkJ5LVJpZ2h0IENNWC01IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfQ09ERSA9PSAiSUNNWCIgfiAiQnktUmlnaHQgSUNNWCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIkNNWC0yIiB+ICJTcGVjIEV4ZWNwdCBDTVgtMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HX0NPREUgPT0gIkNNWC0yLjUiIH4gIlNwZWMgRXhlY3B0IENNWC0yLjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJDTVgtMyIgfiAiU3BlYyBFeGVjcHQgQ01YLTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9OR19DT0RFID09ICJJUk1YIiB+ICJTcGVjIEV4ZWNwdCBJUk1YIikpLA0KICAgICAgICB6Y29sID0gIkxPTkdfQ09ERSIsIGNvbC5yZWdpb25zPWxpc3QoIiNmZmZmYjIiLCAiI2ZlY2M1YyIsICIjZmQ4ZDNjIiwgIiNlMzFhMWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNlZGY4ZmIiLCAiI2IzY2RlMyIsICIjOGM5NmM2IiwgIiM4ODQxOWQiKSwNCiAgICAgICAgY29sID0gbGlzdCgidHJhbnNwYXJlbnQiKSwNCiAgICAgICAgbGF5ZXIubmFtZSA9ICJab25pbmcgRGlzdHJpY3RzIikNCg0KDQojICsNCiNtYXB2aWV3KGxpY2Vuc2VzICU+JSANCiMgIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KIyAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiMgIHN0X2pvaW4oLiwgem9uZXMpLCB6Y29sID0gImFzc2VtYmx5X2FsbG93ZWQiKSAgDQpgYGANCg0KDQojIyAzLjQuIFNBT0wgaXNzdWFuY2UgdGltZWxpbmUNCg0KVmVyeSBmZXcgU0FPTHMgYXJlIGlzc3VlZCBpbiBQaGlsbHksIGFuZCBlc3BlY2lhbGx5IGZldyB0aGUgbGFzdCB0d28geWVhcnMuIFRoZSBmb2xsb3dpbmcgY2hhcnQgc2hvd3MgdGhlIGRhdGUgd2hlbiBTQU9MJ3Mgd2VyZSBpc3N1ZWQuIDIwMDYgcHJvYmFibHkgaGFzIGRhdGEgaW5mbGF0ZWQgYnkgdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQta2VlcGluZyBwZXJpb2QgZm9yIHRoZXNlIGRhdGEuDQoNCkRBVEEgRlJPTSBPUEVOREFUQVBISUxMWSBVTkFWQUlMQUJMRSA1LzgvMjAyMg0KDQpgYGB7ciBsaWNlbnNlX3RpbWVsaW5lLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGljZW5zZXMgJT4lDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiKSAlPiUNCiAgbXV0YXRlKHllYXJfb3BlbmVkID0geWVhcihhcy5EYXRlKGluaXRpYWxpc3N1ZWRhdGUpKSkgJT4lDQogIGdyb3VwX2J5KHllYXJfb3BlbmVkKSAlPiUNCiAgdGFsbHkoKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gbiwgeCA9IHllYXJfb3BlbmVkKSwgc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZT0iU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kgTGljZW5zZSBBY3RpdmUgRGF0ZXMiLA0KICAgICAgIHg9IlllYXIiLCANCiAgICAgICB5PSJOdW1iZXIgb2YgTGljZW5zZXMiKSsNCiAgcGxvdFRoZW1lDQoNCmBgYA0KDQpSZWNvcmQgbnVtYmVycyBvZiBsaWNlbnNlcyBiZWNhbWUgaW5hY3RpdmUgaW4gMjAyMC4uLiBUaGUgZm9sbG93aW5nIGNoYXJ0IHNob3dzIHRoZSB5ZWFycyBpbiB3aGljaCBTQU9MJ3MgYmVjYW1lIGluYWN0aXZlLiBNZWFud2hpbGUsIHRoZSByZWFsIGVzdGF0ZSBtYXJrZXQgaXMgZ2V0dGluZyBtdWNoIG1vcmUgY29tcGV0aXRpdmUgYW5kIGVudGVydGFpbm1lbnQgd2FnZXMgYXJlIHNsb3cgdG8gcmVjb3ZlciAoc2VlIFNlY3Rpb24gMSBvZiB0aGlzIGRvY3VtZW50KS4NCg0KREFUQSBGUk9NIE9QRU5EQVRBUEhJTExZIFVOQVZBSUxBQkxFIDUvOC8yMDIyDQoNCmBgYHtyIGxpY2Vuc2VfdGltZWxpbmVfaW5hY3RpdmUsIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWNlbnNlcyAlPiUNCiAgZmlsdGVyKGxpY2Vuc2V0eXBlID09ICJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSIsDQogICAgICAgICBpcy5uYShpbmFjdGl2ZWRhdGUpID09IEZBTFNFKSAlPiUNCiAgbXV0YXRlKHllYXJfY2xvc2VkID0geWVhcihhcy5EYXRlKGluYWN0aXZlZGF0ZSkpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9jbG9zZWQpICU+JQ0KICB0YWxseSgpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBuLCB4ID0geWVhcl9jbG9zZWQpLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlPSJTcGVjaWFsIEFzc2VtYmx5IE9jY3VwYW5jeSBMaWNlbnNlIEluYWN0aXZlIERhdGVzIiwNCiAgICAgICB4PSJZZWFyIiwgDQogICAgICAgeT0iTnVtYmVyIG9mIExpY2Vuc2VzIikrDQogIHBsb3RUaGVtZQ0KDQpgYGANCg0KYGBge3IgbWFwX2xpY2Vuc2VzLCBlY2hvPUZBTFNFLCBldmFsID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCm1hcHZpZXcobGljZW5zZXMgJT4lIA0KICBmaWx0ZXIobGljZW5zZXR5cGUgPT0gIlNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IiwNCiAgICAgICAgIGxpY2Vuc2VzdGF0dXMgPT0gIkFjdGl2ZSIpICU+JSANCiAgc3Rfam9pbiguLCB6b25lcyksIHpjb2wgPSAiYXNzZW1ibHlfYWxsb3dlZCIpDQpgYGANCg0KQW1vbmcgYWN0aXZlIFNwZWNpYWwgQXNzZW1ibHkgT2NjdXBhbmN5IExpY2Vuc2VzLCBvbmx5IDM1ICgyOCUpIHdlcmUgcGVybWl0dGVkIGJ5IHJpZ2h0IGluIHRoZSB6b25lcyB3aGVyZSB0aGV5IHdlcmUgY3JlYXRlZC4NCg0KREFUQSBGUk9NIE9QRU5EQVRBUEhJTExZIFVOQVZBSUxBQkxFIDUvOC8yMDIyDQoNCmBgYHtyIGxpY2Vuc2VzX2FuZF96b25lcywgZWNobz1GQUxTRSwgZXZhbCA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQpsaWNlbnNlcyAlPiUgDQogIGZpbHRlcihsaWNlbnNldHlwZSA9PSAiU3BlY2lhbCBBc3NlbWJseSBPY2N1cGFuY3kiLA0KICAgICAgICAgbGljZW5zZXN0YXR1cyA9PSAiQWN0aXZlIikgJT4lIA0KICBzdF9qb2luKC4sIHpvbmVzKSAlPiUgDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgZ3JvdXBfYnkoYXNzZW1ibHlfYWxsb3dlZCwgTE9OR19DT0RFKSAlPiUgDQogIHRhbGx5KCkgJT4lDQogIHJlbmFtZShuX2xpY2Vuc2VzID0gbikgJT4lDQogIGxlZnRfam9pbiguLCB6b25lcyAlPiUNCiAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShMT05HX0NPREUpICU+JQ0KICAgICAgICAgICAgICB0YWxseSgpICU+JQ0KICAgICAgICAgICAgICByZW5hbWUoIHRvdGFsX3pvbmVfcGFyY2VscyA9IG4pKSAlPiUNCiAgZ3JvdXBfYnkoYXNzZW1ibHlfYWxsb3dlZCkgJT4lDQogIHN1bW1hcml6ZShuX2xpY2Vuc2VzID0gc3VtKG5fbGljZW5zZXMpKSAlPiUNCiAgbXV0YXRlKHBjdCA9IDEwMCoobl9saWNlbnNlcyAvIHN1bShuX2xpY2Vuc2VzKSkpICU+JQ0KICBrYWJsZSgpDQogIA0KYGBgDQoNCk5leHQgc3RlcHMgLSANCg0KSG93IGhhcyBieS1yaWdodCB2cy4gZXhjZXB0aW9uL3ZhcmlhbmNlIGNoYW5nZWQgb3ZlciB0aW1lPw0KSG93IGlzIHRoaXMgcmVsYXRlZCB0byBwcm9wZXJ0eSBjb3N0cyAvIHRheCByYXRlcyAvIHZhbHVhdGlvbj8NCkhvdyBtYW55IFNBT0xzIGFyZSBhbHNvIGdldHRpbmcgYW11c2VtZW50IGxpY2Vuc2VzPyBIb3cgbWFueSBjYW4gd2UgdmVyaWZ5IGFyZSBtdXNpYyB2ZW51ZXM/DQpBcmUgdGVtcG9yYXJ5IGFzc2VtYmx5IGxpY2Vuc2VzIGluIHRoZSBkYXRhIHNldD8NCg0KREFUQSBGUk9NIE9QRU5EQVRBUEhJTExZIFVOQVZBSUxBQkxFIDUvOC8yMDIyDQoNCiMgTmV4dCB1cCBmb3IgYW5hbHlzaXMNCg0Kb3ZlcmxheXMsIE1vYmlsaXR5IHRyZW5kcywgUFBQIGRhdGEsIElsbHVtaW5hdGUgdGhlIEFydHMgZ3JhbnRzDQoNCg0KQmlrZSBTaGFyZSBhbmQgTW9iaWxpdHkNCg0KUGhpbGFkZWxwaGlhIEJpa2UgU2hhcmUgUTIsIDIwMjENCg0KYGBge3IgbG9hZF9tb2JpbGl0eSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBldmFsID0gRkFMU0V9DQp1cmwgPC0iaHR0cHM6Ly91NjI2bjI2aDc0ZjE2aWcxcDNwdDBmMmctd3BlbmdpbmUubmV0ZG5hLXNzbC5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDQvaW5kZWdvLXRyaXBzLTIwMjEtcTEuemlwIg0KDQp0ZW1wIDwtIHRlbXBmaWxlKCkNCnRlbXAyIDwtIHRlbXBmaWxlKCkNCg0KZG93bmxvYWQuZmlsZSh1cmwsIHRlbXApDQp1bnppcCh6aXBmaWxlID0gdGVtcCwgZXhkaXIgPSB0ZW1wMikNCnExXzIwMjEgPC0gcmVhZC5jc3YoZmlsZS5wYXRoKHRlbXAyLCAiaW5kZWdvLXRyaXBzLTIwMjEtcTEuY3N2IikpDQoNCnVubGluayhjKHRlbXAsIHRlbXAyKSkNCg0KdXJsIDwtImh0dHBzOi8vdTYyNm4yNmg3NGYxNmlnMXAzcHQwZjJnLXdwZW5naW5lLm5ldGRuYS1zc2wuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIxLzA3L2luZGVnby10cmlwcy0yMDIxLXEyLnppcCINCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQp0ZW1wMiA8LSB0ZW1wZmlsZSgpDQoNCmRvd25sb2FkLmZpbGUodXJsLCB0ZW1wKQ0KdW56aXAoemlwZmlsZSA9IHRlbXAsIGV4ZGlyID0gdGVtcDIpDQpxMl8yMDIxIDwtIHJlYWQuY3N2KGZpbGUucGF0aCh0ZW1wMiwgImluZGVnby10cmlwcy0yMDIxLXEyLmNzdiIpKQ0KDQp1bmxpbmsoYyh0ZW1wLCB0ZW1wMikpDQoNCnVybCA8LSJodHRwczovL3U2MjZuMjZoNzRmMTZpZzFwM3B0MGYyZy13cGVuZ2luZS5uZXRkbmEtc3NsLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8xMC9pbmRlZ28tdHJpcHMtMjAyMS1xMy56aXAiDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KdGVtcDIgPC0gdGVtcGZpbGUoKQ0KDQpkb3dubG9hZC5maWxlKHVybCwgdGVtcCkNCnVuemlwKHppcGZpbGUgPSB0ZW1wLCBleGRpciA9IHRlbXAyKQ0KcTNfMjAyMSA8LSByZWFkLmNzdihmaWxlLnBhdGgodGVtcDIsICJpbmRlZ28tdHJpcHMtMjAyMS1xMy5jc3YiKSkNCg0KdW5saW5rKGModGVtcCwgdGVtcDIpKQ0KDQp1cmwgPC0iaHR0cHM6Ly91NjI2bjI2aDc0ZjE2aWcxcDNwdDBmMmctd3BlbmdpbmUubmV0ZG5hLXNzbC5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjIvMDEvaW5kZWdvLXRyaXBzLTIwMjEtcTQuemlwIg0KDQp0ZW1wIDwtIHRlbXBmaWxlKCkNCnRlbXAyIDwtIHRlbXBmaWxlKCkNCg0KZG93bmxvYWQuZmlsZSh1cmwsIHRlbXApDQp1bnppcCh6aXBmaWxlID0gdGVtcCwgZXhkaXIgPSB0ZW1wMikNCnE0XzIwMjEgPC0gcmVhZC5jc3YoZmlsZS5wYXRoKHRlbXAyLCAiaW5kZWdvLXRyaXBzLTIwMjEtcTQuY3N2IikpDQoNCnVubGluayhjKHRlbXAsIHRlbXAyKSkNCg0KZGF0IDwtIHExXzIwMjEgJT4lDQogIHJiaW5kKC4sIHEyXzIwMjEpICU+JQ0KICByYmluZCguLCBxM18yMDIxKSAlPiUNCiAgcmJpbmQoLiwgcTRfMjAyMSkNCg0KcmVtb3ZlKHExXzIwMjEpDQpyZW1vdmUocTJfMjAyMSkNCnJlbW92ZShxM18yMDIxKQ0KcmVtb3ZlKHE0XzIwMjEpDQoNCnBoaWxhX3NocCA8LSBjb3VudGllcygiUEEiKSAlPiUNCiAgZmlsdGVyKE5BTUUgPT0gIlBoaWxhZGVscGhpYSIpICU+JQ0KICBzdF9hc19zZihjcnMgPSA0MzI2KQ0KDQpkYXQyIDwtIGRhdCAlPiUNCiAgbXV0YXRlKGludGVydmFsNjAgPSBmbG9vcl9kYXRlKG1keV9obShzdGFydF90aW1lKSwgdW5pdCA9ICJob3VyIiksDQogICAgICAgICBpbnRlcnZhbDE1ID0gZmxvb3JfZGF0ZShtZHlfaG0oc3RhcnRfdGltZSksIHVuaXQgPSAiMTUgbWlucyIpLA0KICAgICAgICAgd2VlayA9IHdlZWsoaW50ZXJ2YWw2MCksDQogICAgICAgICBkb3R3ID0gd2RheShpbnRlcnZhbDYwLCBsYWJlbD1UUlVFKSkNCmBgYA0KDQoNCmBgYHtyIG1vYmlsaXR5X3RyZW5kcywgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCBldmFsID0gRkFMU0V9DQpnZ3Bsb3QoZGF0MiAlPiUNCiAgICAgICAgIGdyb3VwX2J5KHdlZWspICU+JQ0KICAgICAgICAgdGFsbHkoKSkrDQogIGdlb21fbGluZShhZXMoeCA9IHdlZWssIHkgPSBuKSkrDQogIGxhYnModGl0bGU9IkJpa2Ugc2hhcmUgdHJpcHMgcGVyIHdlZWsgUGhpbGFkZWxwaGlhLCAyMDIxIiwNCiAgICAgICB4PSJXZWVrICgyMDIxKSIsIA0KICAgICAgIHk9IlRyaXBzIikrDQogIHBsb3RUaGVtZQ0KDQpnZ3Bsb3QoZGF0MiAlPiUgbXV0YXRlKGhvdXIgPSBob3VyKG1keV9obShzdGFydF90aW1lKSksDQogICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gbW9udGgobWR5X2htKHN0YXJ0X3RpbWUpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgZGF5X3R5cGUgPSBpZmVsc2UoZG90dyAlaW4lIGMoIlNhdCIsICJTdW4iLCAiRnJpIiksICJXZWVrZW5kIiwgIldlZWtkYXkiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSBjYXNlX3doZW4obW9udGggPT0gMSB+ICIwMS0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMiB+ICIwMi0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMyB+ICIwMy0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNCB+ICIwNC0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNSB+ICIwNS0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNiB+ICIwNi0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNyB+ICIwNy0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gOCB+ICIwOC0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gOSB+ICIwOS0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMTAgfiAiMTAtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDExIH4gIjExLTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSAxMiB+ICIxMi0yMDIxIikpKSsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluPTAsDQogICAgICAgICAgICAgICAgeG1heCA9IDYsDQogICAgICAgICAgICAgICAgeW1pbiA9IDAsDQogICAgICAgICAgICAgICAgeW1heCA9IEluZiksIGZpbGwgPSAnbGlnaHQgZ3JleScsIGFscGhhID0gMC4wNSkrDQogIGdlb21fcmVjdChhZXMoeG1pbj0xOCwNCiAgICAgICAgICAgICAgICB4bWF4ID0gMjQsDQogICAgICAgICAgICAgICAgeW1pbiA9IDAsDQogICAgICAgICAgICAgICAgeW1heCA9IEluZiksIGZpbGwgPSAnbGlnaHQgZ3JleScsIGFscGhhID0gMC4wNSkrDQogIGdlb21fZnJlcXBvbHkoYWVzKGhvdXIsIGNvbG9yID0gZGF5X3R5cGUpLCBiaW53aWR0aCA9IDEpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iSG91ciIsIGJyZWFrcz1zZXEoMCwyNCw2KSkrDQogIGxhYnModGl0bGU9IlRvdGFsIEJpa2UgU2hhcmUgVHJpcHMiLA0KICAgICAgIHN1YnRpdGxlID0gIlBoaWxhZGVscGhpYSwgMjAyMSIsDQogICAgICAgeD0iSG91ciIsIA0KICAgICAgIHk9IlRyaXBzIikrDQogIGZhY2V0X3dyYXAofm1vbnRoKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSsNCiAgcGxvdFRoZW1lDQpgYGANCg0KDQoNCmBgYHtyIG1vYmlsaXR5X21hcCwgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmdncGxvdChkYXQyICU+JQ0KICAgICAgICAgbXV0YXRlKHRpbWVfb2ZfZGF5ID0gaWZlbHNlKGhvdXIoaW50ZXJ2YWw2MCkgPCA0IHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyKGludGVydmFsNjApID4gMjAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOaWdodCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXkiKSwNCiAgICAgICAgICAgICAgICBtb250aCA9IG1vbnRoKG1keV9obShzdGFydF90aW1lKSksDQogICAgICAgICAgICAgICAgbW9udGggPSBjYXNlX3doZW4obW9udGggPT0gMSB+ICIwMS0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSAyIH4gIjAyLTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDMgfiAiMDMtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNCB+ICIwNC0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSA1IH4gIjA1LTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDYgfiAiMDYtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gNyB+ICIwNy0yMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCA9PSA4IH4gIjA4LTIwMjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID09IDkgfiAiMDktMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMTAgfiAiMTAtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMTEgfiAiMTEtMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPT0gMTIgfiAiMTItMjAyMSIpKSAlPiUNCiAgICAgICAgIGdyb3VwX2J5KHN0YXJ0X3N0YXRpb24sIHRpbWVfb2ZfZGF5LCBzdGFydF9sb24sIHN0YXJ0X2xhdCwgbW9udGgpICU+JQ0KICAgICAgICAgdGFsbHkoKSAlPiUNCiAgICAgICAgIGZpbHRlcih0aW1lX29mX2RheSA9PSAiTmlnaHQiKSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwaGlsYV9zaHAsIGZpbGwgPSAiYmxhY2siKSsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IHN0YXJ0X2xvbiwgeSA9IHN0YXJ0X2xhdCwgY29sb3IgPSBuKSwgYWxwaGEgPSAwLjgpKw0KICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKSsNCiAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCh0aXRsZT0iVHJpcHMiKSkrDQogIGxhYnModGl0bGU9Ikdyb3NzIEJpa2UgU2hhcmUgVHJpcHMgQnkgT3JpZ2luIC0gMjA6MDAtNDowMCwgUTIsIDIwMjEiKSsNCiAgZmFjZXRfd3JhcCh+bW9udGgpKw0KICBtYXBUaGVtZQ0KYGBg